/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package obiekty;

import java.awt.Image;
import java.util.ArrayList;
import java.util.Iterator;
import utils.Vector2D;
import zachowania.ZachowaniaSterujace;
import zachowania.potwor.StanPotwora;
import zachowania.potwor.Szukaj;

/**
 *
 * @author m
 */
public abstract class Potwor extends ObiektRuchomy
{

    ZachowaniaSterujace zachowania;
    StanPotwora stanPotwora;
    Vector2D idzDo;
    Vector2D cel;
    private long elapsedTime;
    private long ostatnieUderzenie=0;
protected long type=0;

    public long getType() {
        return type;
    }

    public void setType(long type) {
        this.type = type;
    }
    public long getOstatnieUderzenie()
    {
        return ostatnieUderzenie;
    }

    public void setOstatnieUderzenie(long ostatnieUderzenie)
    {
        this.ostatnieUderzenie = ostatnieUderzenie;
    }

    public Potwor(Image image)
    {
        super(image);
        zachowania = new ZachowaniaSterujace();
        idzDo = new Vector2D(200, 300);
        stanPotwora = new Szukaj();
        zycie = 10;
        ArrayList<Vector2D> path = new ArrayList<Vector2D>();
        path.add(new Vector2D(Math.random() * 800, Math.random() * 600));
        path.add(new Vector2D(Math.random() * 800, Math.random() * 600));
        path.add(new Vector2D(Math.random() * 800, Math.random() * 600));
        path.add(new Vector2D(Math.random() * 800, Math.random() * 600));
        path.add(new Vector2D(Math.random() * 800, Math.random() * 600));
        zachowania.setPath(path);

    }

    @Override
    public void update(long elapsedTime)
    {

        this.elapsedTime = elapsedTime;
        stanPotwora.wykonaj(this);
    }

    public boolean wybierzPrzywodce()
    {
        Iterator<ObiektRuchomy> it = this.grupa.getListaObiektow().iterator();
        int liczbaPotworow = 0;
        int mZycie = 0;
        ObiektRuchomy nowyPrzywodca = null;
        while (it.hasNext())
        {
            ObiektRuchomy o = it.next();
            if (o.zycie > mZycie)
            {
                nowyPrzywodca = o;
            }
            liczbaPotworow++;
        }

        if (liczbaPotworow > 1 && nowyPrzywodca != null)
        {
            this.grupa.setPrzywodca(nowyPrzywodca);
            ((Potwor) nowyPrzywodca).zmienStan(new Szukaj());
            return true;
        }
        return false;
    }

    /**
     * Zmienia stan zachowania się potwora
     * @param nowy
     */
    public void zmienStan(StanPotwora nowy)
    {
        stanPotwora = nowy;
    }

    public boolean idzDoPunktu()
    {
        zachowania.wanderOff();
        zachowania.separationOff();
        zachowania.aligmentOff();
        zachowania.cohesionOff();
        zachowania.arriveOn();
        zachowania.obstacleAvoidanceOn();
        wyliczPrzesuniecie(zachowania.calculate(this, idzDo));
        if (sila.length() < 0.001 && pozycja.subtract(idzDo).length() < 2.0)
        {
            przesunObiekt(idzDo);
            //pozycja.x = idzDo.x;
            //pozycja.y = idzDo.y;
            return true;
        }
        return false;
    }

    public boolean idzZaPrzywodca()
    {
        zachowania.wanderOff();
        zachowania.seekOff();
        zachowania.separationOn();
        zachowania.aligmentOn();
        zachowania.cohesionOn();
        zachowania.arriveOn();
        zachowania.obstacleAvoidanceOn();
        wyliczPrzesuniecie(zachowania.calculate(this, idzDo));

        return false;
    }

    public boolean szukajCelu()
    {
        zachowania.arriveOff();
        zachowania.wanderOn();

        wyliczPrzesuniecie(zachowania.calculate(this, idzDo));
        if (pozycja.subtract(idzDo).length() < 200)
        {
            return true;
        }
        return false;
    }

    /**
     * Czyści punkt idź do -> jak nie jest potrzebny bo jesteśmy w nim
     */
    public void wyczyscPunktIdzDo()
    {
        idzDo = null;
    }

    /**
     * Sprawdza czy punkt idź do został obrany
     * @return
     */
    public boolean obranoPunktIdzDo()
    {
        return idzDo == null ? false : true;
    }

    /**
     * Ustawia punkt do którego potwór ma iść 
     * @param v
     */
    public void setIdzDo(Vector2D v)
    {
        idzDo = v;
    }

    private void kill()
    {
    }

    /**
     * Wyznacza siły, prędkość i położenie obiektu po przyłożeniu siły
     * w czasie elapsedTime
     * @param steeringForce
     */
    private void wyliczPrzesuniecie(Vector2D steeringForce)
    {
        sila = steeringForce;
        if (sila.length() != 0)
        {
            predkosc = predkosc.add((sila.divide(masa).multiple(elapsedTime)));
            predkosc = predkosc.cutTo(maxPredkosc);
            if (predkosc.length() > 0.00001)
            {
                orientacja = predkosc.normalize();
            }
        } else
        {
            predkosc.x = 0;
            predkosc.y = 0;
        }
        przesunObiekt(pozycja.add(predkosc.multiple(elapsedTime)));
    }
    
    
}
